#ifndef SIMUL_H
#define SIMUL_H

#include <vector>
using namespace std;

typedef struct task_struct Task;
typedef struct global_domain Cluster;
typedef struct core_domain Core;

/* ------------------------------------------------------------------------- */

//双向循环链表保存资源集合、任务集合以及就绪队列，带头结点
struct __task_queue_node{
    Task *task;
    struct __task_queue_node *pre, *next;
};

typedef struct __task_queue_node task_queue_node;

typedef task_queue_node ready_queue_node;

/* ------------------------------------------------------------------------- */

/*更新记录：
 *添加一个数据结构，core_list作为全局调度表中
 *表示集群中调度核的信息，按照核上当前调度任务
 *的优先级进行排序，头结点后第一个节点跟的是优
 *先级最低的核，如果没有任务调度，其优先级为-1
 *2020/08/12
 * */
struct __core_list{
    Core *core;
    struct __core_list *pre, *next;
};

typedef struct __core_list core_list;

/* ------------------------------------------------------------------------- */

extern const int Primary;
extern const int Backup;

extern const int PrioMax;
extern const int PrioMin;
extern const int CoreMax;
extern int Highest_prior;

extern Core *local_core;
extern Core cores[];
extern Cluster *current_cluster;
extern Cluster clusters[];
extern Task *current; //表示本核上当前执行的任务实例
extern Task taskSets[256];
extern int lcm;

extern int taskID;
extern int mode; //1为本地模式 2为set-MRTS模式
extern int cluster_num; //集群数
extern int cluster_core_num; //集群中调度核数量
extern int taskNum;
extern int M; //处理器个数
extern int Time; //全局时钟
extern int joined_row;
extern int simulation_speed;
extern int chi; //希腊字母X，写作chi，读作kai

extern task_queue_node *wait_for_join; //待加入任务的队列
extern vector<Task*> joined_task; //已经加入的任务
extern core_list *core_utilization; //按利用率排序的处理器队列

/* ------------------------------------------------------------------------- */

task_queue_node *init_task_list_head();   //初始化任务队列

void add_task_list(task_queue_node *New, task_queue_node *pre, task_queue_node *next);  //加入任务队列

void add_task_list_tail(task_queue_node *New, task_queue_node *head);   //加入任务队列的末尾

void del_task_list(task_queue_node *pre, task_queue_node *next);    //移出任务队列

core_list *init_core_list_head();   //初始化处理器队列

void add_core_list(core_list *New, core_list *pre, core_list *next);    //加入处理器队列

void add_core_list_tail(core_list *New, core_list *head);   //加入处理器队列的末尾

void del_core_list(core_list *pre, core_list *next);   //移出处理器队列

#endif // SIMUL_H
